/*
 * DotLabelItem.h
 * 点标签项头文件
 * 定义了DotLabelItem类，用于在图形场景中显示带有圆点和文本的标签
 */
#pragma once

#include <QtGlobal>
#include <QPainter>
#include <QToolTip>
#include <QHelpEvent>
#include <QGraphicsSceneHoverEvent>
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsItem>

#if 0
/**
 * @brief 点标签项类
 * @details 继承自QGraphicsItem，用于在图形场景中显示带有圆点和文本的标签
 *          支持设置文本、工具提示，并处理鼠标悬停事件
 */
class DotLabelItem : public QGraphicsItem
{
public:
	/**
	 * @brief 构造函数
	 * @param text 标签文本
	 * @param parent 父图形项
	 * @details 初始化点标签项，设置光标、接受悬停事件、初始化字体并更新文字尺寸
	 */
	explicit DotLabelItem(const QString& text,
		QGraphicsItem* parent = nullptr)
		: QGraphicsItem(parent), m_text(text), m_toolTip(text)
	{
		setCursor(QCursor(Qt::ArrowCursor));
		setAcceptHoverEvents(true);          // 关键：接收 hover

		// 1️⃣ 初始化字体：优先取视图字体，否则用应用默认
		QGraphicsScene* s = scene();
		if (s && !s->views().isEmpty())
			m_font = s->views().first()->font();   // 视图字体
		else
			m_font = QApplication::font();         // 应用全局字体
		m_font.setPixelSize(11); // 设置字体像素大小

		updateMetrics();// 更新文字尺寸
	}

	/**
	 * @brief 边界矩形
	 * @return 包含整个图形项的边界矩形
	 * @details 重写QGraphicsItem的方法，返回点标签项的边界矩形
	 */
	QRectF boundingRect() const override
	{
#if 0
		// 圆点半径 4，文字在右侧 4px 间隙
		return QRectF(-4, -4,
			8 + 4 + m_textRect.width(),
			qMax(8., m_textRect.height()));
#else
		// 整体宽度、高度
		qreal w = 8 + 4 + m_textRect.width(); // 圆点直径+ 文字在右侧间隙 + 文字宽度
		qreal h = qMax(8.0, m_textRect.height()); // 圆点直径/文字高度
		// 把原点放在中心，方便后续坐标计算
		return QRectF(-w / 2, -h / 2, w, h); // 左,上,宽,高
#endif

	}

	/**
	 * @brief 绘制函数
	 * @param painter 绘图工具
	 * @param option 样式选项
	 * @param widget 关联的部件
	 * @details 重写QGraphicsItem的方法，绘制圆点和文本
	 */
	void paint(QPainter* painter,
		const QStyleOptionGraphicsItem* option,
		QWidget* widget = nullptr) override
	{
		Q_UNUSED(option); Q_UNUSED(widget);
#if 0
		// 1. 画圆点（矢量）
		painter->setPen(Qt::NoPen);
		painter->setBrush(Qt::red);
		painter->drawEllipse(QPointF(0, 0), 4, 4);

		// 2. 画文字（矢量，字体抗锯齿）
		painter->setPen(Qt::black);
		painter->setFont(QFont());
		painter->drawText(QPointF(8, 4), m_text);  // 8 是水平偏移
#else
		const QRectF br = boundingRect();
		const qreal h = br.height();
		const qreal y = -4;                 // 椭圆中心 y = 0 (因为整体已居中)
		const qreal textY = 4;                // 文字基线偏移（相对于椭圆中心）

		/* 1. 圆点（垂直居中） */
		painter->setPen(Qt::NoPen);
		painter->setBrush(Qt::red);
		//painter->drawEllipse(QPointF(-(8 + 4 + m_textRect.width()) / 2 + 4, 0), 4, 4);
		painter->drawEllipse(QPointF(br.left() + 4, 0), 4, 4);

		/* 2. 文字（垂直居中） */
		painter->setPen(Qt::black);
		painter->setFont(m_font);

		// 文字左边缘 = 圆点右侧 + 4
		//qreal textLeft = -(8 + 4 + m_textRect.width()) / 2 + 8 + 4;
		qreal textLeft = br.left() + 8 + 4; // x+圆点直径 + 4px间隙
		// 文字基线 = 垂直中心 + 字体基线偏移
		qreal textBase = QFontMetricsF(m_font).ascent() - m_textRect.height() / 2;

		painter->drawText(QPointF(textLeft, textBase), m_text);
#endif

	}

	/**
	 * @brief 设置文本
	 * @param t 新的文本内容
	 * @details 更新标签的文本内容，并重新计算尺寸
	 */
	void setText(const QString& t)
	{
		prepareGeometryChange();
		m_text = t;
		updateMetrics();// 更新文字尺寸
	}
	/* ---------- tooltip ---------- */
	void setToolTip(const QString& tip)
	{
		m_toolTip = tip;
	}

protected:
	void hoverMoveEvent(QGraphicsSceneHoverEvent* event) override
	{
		QGraphicsItem::hoverMoveEvent(event);
		// 把 scene 坐标映射到屏幕坐标
		QPoint globalPos = event->screenPos();
		QToolTip::showText(globalPos, m_toolTip);
	}
	void hoverEnterEvent(QGraphicsSceneHoverEvent* event) override
	{
		QGraphicsItem::hoverMoveEvent(event);
		// 把 scene 坐标映射到屏幕坐标
		QPoint globalPos = event->screenPos();
		QToolTip::showText(globalPos, m_toolTip);
	}

	void hoverLeaveEvent(QGraphicsSceneHoverEvent* event) override
	{
		QGraphicsItem::hoverLeaveEvent(event);
		QToolTip::hideText();
	}

private:
	// 更新文字尺寸
	void updateMetrics()
	{
		m_textRect = QFontMetricsF(m_font).boundingRect(m_text);
	}
private:
	QString m_text;
	QString m_toolTip;
	QRectF  m_textRect;
	QFont m_font;  // 缓存字体，避免重复创建

};

#else
#include <QGraphicsEllipseItem>
#include <QGraphicsTextItem>
#include <QTextCursor>
#include <QTextBlockFormat>

class DotLabelItem : public QGraphicsEllipseItem
{
public:
	explicit DotLabelItem(const QString& text,
		QGraphicsItem* parent = nullptr)
		: QGraphicsEllipseItem(parent), m_toolTip(text)
	{
		qreal radius = 6.; // 圆点半径
		qreal diameter = radius * 2;// 圆点直径 
		qreal textInterval = 4.; // 文字间隔
		/* 1. 椭圆：圆点 8×8，中心在 (0,0) */
		setRect(-radius, -radius, diameter, diameter);
		setBrush(Qt::red);
		setPen(Qt::NoPen);
		
		/* 2. 文字项：放在椭圆右侧 4 像素 */
		m_textItem = new QGraphicsTextItem(text, this);
		m_textItem->setHtml("<div style='text-align:center; vertical-align:middle;'>" + text + "</div>");
		/* 3. 文字垂直居中 */
		QFont f = m_textItem->font();
		auto br = boundingRect();
		// 垂直居中修正
		// 获取字体度量
		QFontMetricsF fm(m_textItem->font());
		qreal ascent = fm.ascent();		// 上行高度
		qreal descent = fm.descent();	// 下行深度
		qreal leading = fm.leading();	// 上留白

		m_textItem->setPos(br.right() + textInterval, -m_textItem->boundingRect().height() / 2.); // 圆与文本项 中心对齐
		
		// 计算 Y 偏移量 = 矩形边界高度 - 上留白
		qreal yOffset = (m_textItem->boundingRect().height() - fm.leading()) / 2.0;
		m_textItem->setPos(br.right() + textInterval, -yOffset);	// 圆与字体中心对齐
		m_textItem->setDefaultTextColor(m_normalColor); // 默认颜色
#if  辅助参考线
		auto line = new QGraphicsLineItem(0, -15, 0, 15, this); // Y轴参考线（父项中心）
		line->setPen(QPen(Qt::blue));
		line = new QGraphicsLineItem(-15,0, 15, 0,  this); // X轴参考线（父项中心）
		line->setPen(QPen(Qt::red));

		
		line = new QGraphicsLineItem(0, -15, 0, 15, m_textItem); // Y轴参考线（父项中心）
		line->setPen(QPen(Qt::blue));
		line = new QGraphicsLineItem(-15, 0, 15, 0, m_textItem); // X轴参考线（父项中心）
		line->setPen(QPen(Qt::red));

		auto wX = m_textItem->boundingRect().width() / 2;
		auto wY = m_textItem->boundingRect().height() / 2;
		line = new QGraphicsLineItem(wX, 0, wX, m_textItem->boundingRect().height(), m_textItem); // Y轴参考线（父项中心）
		line->setPen(QPen(Qt::blue));
		line = new QGraphicsLineItem(0, wY, m_textItem->boundingRect().width(), wY, m_textItem); // X轴参考线（父项中心）
		line->setPen(QPen(Qt::red));
#endif

		/* 4. 交互 */
		setAcceptHoverEvents(true);
		setCursor(Qt::ArrowCursor);
	}

	void setText(const QString& t)
	{
		m_textItem->setPlainText(t);
	}
	/* ---------- tooltip ---------- */
	void setToolTip(const QString& tip)
	{
		m_toolTip = tip;
	}

protected:
	void hoverMoveEvent(QGraphicsSceneHoverEvent* event) override
	{
		QGraphicsItem::hoverMoveEvent(event);
		// 把 scene 坐标映射到屏幕坐标
		QPoint globalPos = event->screenPos();
		QToolTip::showText(globalPos, m_toolTip);
		m_textItem->setDefaultTextColor(m_hoverColor); // 悬停时颜色
	}
	void hoverEnterEvent(QGraphicsSceneHoverEvent* event) override
	{
		QGraphicsItem::hoverMoveEvent(event);
		// 把 scene 坐标映射到屏幕坐标
		QPoint globalPos = event->screenPos();
		QToolTip::showText(globalPos, m_toolTip);
		m_textItem->setDefaultTextColor(m_hoverColor); // 悬停时颜色
	}

	void hoverLeaveEvent(QGraphicsSceneHoverEvent* event) override
	{
		QGraphicsItem::hoverLeaveEvent(event);
		QToolTip::hideText();
		m_textItem->setDefaultTextColor(m_normalColor); // 默认颜色
	}
private:
	QString m_toolTip;
	QColor             m_normalColor = Qt::black;
	QColor             m_hoverColor = QColor(255, 177, 13);
	QGraphicsTextItem* m_textItem = nullptr;
};

#endif